#ifndef SFTPMANAGER_H
#define SFTPMANAGER_H

#include <QObject>
#include <QString>
#include <QList>
#include <QFile>
#include <QDir>
#include <QFileInfo>
#include <QDateTime>
#include <QMutex>
#include <QTimer>
#include "sshmanager.h"

class SshSession;

/**
 * @brief SFTP文件传输管理器
 *
 * 提供完整的SFTP文件操作功能
 * 支持上传、下载、目录浏览等操作
 */
class SftpManager : public QObject
{
    Q_OBJECT

public:
    struct FileTransferInfo {
        QString localPath;
        QString remotePath;
        qint64 totalSize;
        qint64 transferredSize;
        bool isUpload;
        QDateTime startTime;
        QDateTime endTime;
        QString status;
        QString error;
        int speed; // bytes per second
    };

    struct DirectoryItem {
        QString name;
        QString path;
        qint64 size;
        bool isDirectory;
        bool isFile;
        bool isSymlink;
        QString permissions;
        QString owner;
        QString group;
        QDateTime lastModified;
        QString symlinkTarget;
    };

    explicit SftpManager(SshSession *session, QObject *parent = nullptr);
    ~SftpManager();

    // 连接管理
    bool isConnected() const;
    bool initialize();
    void shutdown();
    void cleanup();

    // 目录操作
    QList<DirectoryItem> listDirectory(const QString &path);
    bool changeDirectory(const QString &path);
    QString getCurrentDirectory() const;
    bool createDirectory(const QString &path);
    bool removeDirectory(const QString &path, bool recursive = false);

    // 文件操作
    bool uploadFile(const QString &localPath, const QString &remotePath = QString());
    bool downloadFile(const QString &remotePath, const QString &localPath = QString());
    bool deleteFile(const QString &remotePath);
    bool renameFile(const QString &oldPath, const QString &newPath);
    bool copyFile(const QString &sourcePath, const QString &destPath);
    bool removeFile(const QString &path);
    qint64 getFileSize(const QString &remotePath) const;
    QDateTime getLastModified(const QString &remotePath) const;
    bool fileExists(const QString &remotePath) const;

    // 权限操作
    bool chmod(const QString &path, int mode);
    bool chown(const QString &path, const QString &owner, const QString &group);
    QString getPermissions(const QString &path) const;

    // 符号链接
    bool createSymlink(const QString &target, const QString &linkPath);
    QString readSymlink(const QString &linkPath);

    // 传输管理
    QList<FileTransferInfo> getActiveTransfers() const;
    bool cancelTransfer(const QString &transferId);
    void pauseTransfer(const QString &transferId);
    void resumeTransfer(const QString &transferId);

    // 批量操作
    bool uploadDirectory(const QString &localDir, const QString &remoteDir);
    bool downloadDirectory(const QString &remoteDir, const QString &localDir);

signals:
    void connected();
    void disconnected();
    void error(const QString &error);
    void directoryListed(const QString &path, const QList<DirectoryItem> &items);
    void fileTransferStarted(const QString &transferId);
    void fileTransferProgress(const QString &transferId, qint64 transferred, qint64 total);
    void fileTransferFinished(const QString &transferId, bool success);
    void fileTransferError(const QString &transferId, const QString &error);
    void operationProgress(const QString &operation, int percentage);

private slots:
    void onTransferProgress();
    void checkTransfers();

private:
    SshSession *m_sshSession;
    bool m_connected;
    QString m_currentDirectory;
    LIBSSH2_SFTP *m_sftpSession;

    // 传输管理
    QMap<QString, FileTransferInfo> m_activeTransfers;
    QTimer *m_transferTimer;
    QMutex m_mutex;
    QString m_lastError;

    // 内部方法
    QString generateTransferId() const;
    bool validateLocalPath(const QString &path) const;
    bool validateRemotePath(const QString &path) const;
    QString getRelativePath(const QString &basePath, const QString &filePath) const;

    // 文件传输实现
    bool performUpload(const QString &localPath, const QString &remotePath, const QString &transferId);
    bool performDownload(const QString &remotePath, const QString &localPath, const QString &transferId);

    // 目录操作实现
    bool performDirectoryUpload(const QString &localDir, const QString &remoteDir, const QString &transferId);
    bool performDirectoryDownload(const QString &remoteDir, const QString &localDir, const QString &transferId);

    // 辅助方法
    DirectoryItem createDirectoryItem(const QString &path, const QString &name);
    QString formatPermissions(int mode) const;
    QString formatSize(qint64 size) const;
    QString formatSpeed(qint64 bytesPerSec) const;
    bool isBinaryFile(const QString &path) const;

    // 错误处理
    void setLastError(const QString &error);
    QString getLastSError() const;
};

#endif // SFTPMANAGER_H
